// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "Kismet/BlueprintAsyncActionBase.h"

#include "AsyncAction_ExperienceReady.generated.h"

class AGameStateBase;
class ULyraExperienceDefinition;
class UWorld;
struct FFrame;

/**
 * 异步操作完成时的动态多播委托
 */
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FExperienceReadyAsyncDelegate);

/**
 * 异步等待游戏状态准备就绪并有效，然后调用OnReady事件。
 * 如果游戏状态已经有效，将立即调用OnReady。
 */
UCLASS()
class UAsyncAction_ExperienceReady : public UBlueprintAsyncActionBase
{
	GENERATED_UCLASS_BODY()

public:
	/**
	 * 等待经验确定并加载完成
	 * @param WorldContextObject 世界上下文对象
	 * @return 创建的异步操作对象
	 */
	UFUNCTION(BlueprintCallable, meta=(WorldContext = "WorldContextObject", BlueprintInternalUseOnly="true"))
	static UAsyncAction_ExperienceReady* WaitForExperienceReady(UObject* WorldContextObject);

	/**
	 * 激活异步操作
	 */
	virtual void Activate() override;

public:
	/**
	 * 当经验已经确定并准备/加载完成时调用
	 */
	UPROPERTY(BlueprintAssignable)
	FExperienceReadyAsyncDelegate OnReady; // 经验准备就绪委托

private:
	/**
	 * 步骤1：处理游戏状态设置
	 * @param GameState 游戏状态
	 */
	void Step1_HandleGameStateSet(AGameStateBase* GameState);
	
	/**
	 * 步骤2：监听经验加载
	 * @param GameState 游戏状态
	 */
	void Step2_ListenToExperienceLoading(AGameStateBase* GameState);
	
	/**
	 * 步骤3：处理经验加载完成
	 * @param CurrentExperience 当前经验定义
	 */
	void Step3_HandleExperienceLoaded(const ULyraExperienceDefinition* CurrentExperience);
	
	/**
	 * 步骤4：广播准备就绪
	 */
	void Step4_BroadcastReady();

	TWeakObjectPtr<UWorld> WorldPtr; // 世界对象弱指针
};